package com.mask.token.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.time.Duration;
import java.util.Arrays;
import java.util.List;

/**
 * Mask Token 配置属性
 *
 * @author mask
 * @since 1.0.0
 */
@Data
@ConfigurationProperties(prefix = "mask.token")
public class MaskTokenProperties {

    /**
     * JWT密钥
     */
    private String secret = "mask-token-secret-key-2024";

    /**
     * Token过期时间
     */
    private Duration accessTokenValidity = Duration.ofHours(2);

    /**
     * Refresh Token过期时间
     */
    private Duration refreshTokenValidity = Duration.ofDays(7);

    /**
     * 是否启用Token自动续期
     */
    private boolean autoRenewal = true;

    /**
     * Token续期阈值（剩余时间小于此值时自动续期）
     */
    private Duration renewalThreshold = Duration.ofMinutes(30);

    /**
     * 是否启用多端登录
     */
    private boolean multiDeviceLogin = true;

    /**
     * 单端登录时是否踢出其他设备
     */
    private boolean kickOutOtherDevices = true;

    /**
     * 忽略认证的路径
     */
    private List<String> ignoreUrls = Arrays.asList(
            "/login", "/register", "/logout", "/error", "/actuator/**"
    );

    /**
     * 忽略认证的静态资源
     */
    private List<String> ignoreStaticResources = Arrays.asList(
            "/static/**", "/public/**", "/resources/**", "/webjars/**", "/favicon.ico"
    );

    /**
     * 是否启用CORS
     */
    private boolean enableCors = true;

    /**
     * CORS允许的源
     */
    private List<String> allowedOrigins = Arrays.asList("*");

    /**
     * CORS允许的方法
     */
    private List<String> allowedMethods = Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS");

    /**
     * CORS允许的头部
     */
    private List<String> allowedHeaders = Arrays.asList("*");

    /**
     * 是否启用CSRF保护
     */
    private boolean enableCsrf = false;

    /**
     * 是否启用Session管理
     */
    private boolean enableSessionManagement = true;

    /**
     * 最大并发Session数
     */
    private int maxSessions = 1;

    /**
     * Session过期时是否阻止新登录
     */
    private boolean preventLogin = false;

    /**
     * 是否启用Redis存储
     */
    private boolean enableRedis = true;

    /**
     * Redis Key前缀
     */
    private String redisKeyPrefix = "mask:token";

    /**
     * Redis连接超时时间（毫秒）
     */
    private int redisTimeout = 5000;

    /**
     * Redis最大重试次数
     */
    private int redisMaxRetries = 3;

    /**
     * 监控配置
     */
    private Monitor monitor = new Monitor();

    /**
     * 黑名单配置
     */
    private Blacklist blacklist = new Blacklist();

    /**
     * 刷新策略配置
     */
    private RefreshStrategy refreshStrategy = new RefreshStrategy();

    /**
     * 监控配置
     */
    @Data
    public static class Monitor {
        /**
         * 是否启用监控
         */
        private boolean enabled = false;

        /**
         * 监控数据保留时间（小时）
         */
        private int retentionHours = 24;

        /**
         * 是否记录详细日志
         */
        private boolean detailedLogging = false;
    }

    /**
     * 黑名单配置
     */
    @Data
    public static class Blacklist {
        /**
         * 是否启用黑名单
         */
        private boolean enabled = true;

        /**
         * 黑名单默认过期时间（小时）
         */
        private int defaultExpireHours = 24;

        /**
         * 是否自动清理过期黑名单
         */
        private boolean autoCleanup = true;

        /**
         * 清理间隔（分钟）
         */
        private int cleanupIntervalMinutes = 60;
    }

    /**
     * 刷新策略配置
     */
    @Data
    public static class RefreshStrategy {
        /**
         * 刷新策略类型
         * TIME: 基于时间
         * ACTIVITY: 基于活跃度
         * USAGE: 基于使用频率
         * INTELLIGENT: 智能策略
         */
        private String type = "TIME";

        /**
         * 活跃度阈值（分钟）
         */
        private int activeThresholdMinutes = 30;

        /**
         * 最大使用次数
         */
        private int maxUsageCount = 1000;

        /**
         * 是否启用智能刷新
         */
        private boolean intelligentRefresh = false;
    }
}
